#include <bits/stdc++.h>
#include<unordered_set>

#define ll long long
#define ull unsigned long long
#define uint unsigned int

#define YES cout << "YES" << '\n'
#define NO cout << "NO" << '\n'
#define endl '\n'
const int INF = 1e9;
const int MOD = 998244353;
using namespace std;
/*思考

*/
int nums[8][8] = { 0 };
int mark[8][8] = { 0 };
int n, m;
int ans = 0, mx = 0;
void mark1(int x, int y) {
    ++mark[x + 1][y];
    ++mark[x + 1][y + 1];
    ++mark[x + 1][y - 1];

    ++mark[x - 1][y];
    ++mark[x - 1][y + 1];
    ++mark[x - 1][y - 1];

    ++mark[x][y + 1];
    ++mark[x][y - 1];
}
void mark0(int x, int y) {
    --mark[x + 1][y];
    --mark[x + 1][y + 1];
    --mark[x + 1][y - 1];

    --mark[x - 1][y];
    --mark[x - 1][y + 1];
    --mark[x - 1][y - 1];

    --mark[x][y + 1];
    --mark[x][y - 1];
}
void dfs(int x,int y) {
    if (y==m+1) {//一行结束，进入下一行
        dfs(x + 1, 1);
        return;
    }
    if (x == n + 1) {//所有行都结束，更新最大值
        mx = max(mx, ans);
        return;
    }
    dfs(x, y + 1);// 不取此数的情况 
    
    if (mark[x][y] == 0) {//取此数的情况（需保证此数周围没有取其他数，即mark[i][j]==0）
        mark1(x,y);//标记此数周围的数
        ans += nums[x][y];//更新答案
        dfs(x, y + 1);// 进入下一个数的情况
        mark0(x, y);//回溯
        ans -= nums[x][y];//回溯更新答案
    }
        

}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t = 0;
    cin >> t;
    while (t--) {
        cin >> n >> m;
        memset(nums,0 ,sizeof(nums));
        memset(mark,0 ,sizeof(mark));

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                cin >> nums[i][j];
            }
        }
        mx = 0;
        ans = 0;
        dfs(1, 1);
        cout << mx << endl;
    }
        
    return 0;
}